package org.posupe.empresas;

/**
 * @author Marcio Calado
 */
public class RepositorioEmpresasLista implements RepositorioEmpresas {
	private Empresa empresa;

	private RepositorioEmpresasLista proximo;

	private int quantidade;

	public RepositorioEmpresasLista() {
		this.empresa = null;
		this.proximo = null;
		this.quantidade = 0;
	}

	public void atualizar(Empresa empresa) throws EmpresaInexistenteException {
		if (this.empresa != null) {
			if (this.empresa.getCodigo().equals(empresa.getCodigo())) {
				this.empresa = empresa;
			} else {
				this.proximo.atualizar(empresa);
			}
		} else {
			throw new EmpresaInexistenteException(empresa.getCodigo());
		}
	}

	public boolean existe(String cnpj){
		boolean retorno;
		try {
			this.procurar(cnpj);
			retorno = true;
		} catch (EmpresaInexistenteException e) {
			retorno = false;
		}
		return retorno;
	}

	public IteratorEmpresas getIterator() {
		IteratorEmpresasVector retorno = null;
		RepositorioEmpresasLista lista = this;

		retorno = new IteratorEmpresasVector();
		while (lista.empresa != null) {
			retorno.add(lista.empresa);
			lista = lista.proximo;
		}
		return retorno;
	}

	public void inserir(Empresa empresa) {
		if (this.empresa == null) {
			this.empresa = empresa;
			this.proximo = new RepositorioEmpresasLista();
		} else {
			this.proximo.inserir(empresa);
		}
		this.quantidade++;
	}

	public Empresa procurar(String cnpj) throws EmpresaInexistenteException {
		Empresa retorno = null;
		if (this.empresa != null) {
			if (this.empresa.getCodigo().equals(cnpj)) {
				retorno = this.empresa;
			} else {
				retorno = this.proximo.procurar(cnpj);
			}
		} else {
			throw new EmpresaInexistenteException(cnpj);
		}

		return retorno;
	}

	public IteratorEmpresas procurar(Empresa empresa) {
		IteratorEmpresasVector retorno = null;
		RepositorioEmpresasLista lista = this;

		retorno = new IteratorEmpresasVector();
		while (lista.empresa != null) {
			if (lista.empresa.match(empresa)) {
				retorno.add(lista.empresa);
			}
			lista = lista.proximo;
		}
		return retorno;
	}

	public void remover(String cnpj) throws EmpresaInexistenteException {
		if (this.empresa != null) {
			if (this.empresa.getCodigo().equals(cnpj)) {
				this.empresa = this.proximo.empresa;
				this.proximo = this.proximo.proximo;
			} else {
				this.proximo.remover(cnpj);
			}
			this.quantidade--;
		} else {
			throw new EmpresaInexistenteException(cnpj);
		}
	}
}
